package com.example.springsecuritydemo.config;

import com.example.springsecuritydemo.handler.MyAccessDeniedHandler;
import com.example.springsecuritydemo.handler.MyAuthenticationFailureHandler;
import com.example.springsecuritydemo.handler.MyAuthenticationSuccessHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    /**
     * 当我们自定义登录逻辑时，需要用到UserDetailsService和PasswordEncoder，
     * Spring Security要求自定义登录逻辑时容器内必须要有PasswordEncoder实例
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    private MyAccessDeniedHandler myAccessDeniedHandler;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 自定义登录页面，认证成功进入的页面，以及认证失败之后进入的页面
        http.formLogin()
                // 修改自定义表单中，账号和密码名称
                .usernameParameter("user")
                .passwordParameter("pwd")

                // 自定义登录页面的名称
                .loginPage("/login.html")
                // 登录接口访问地址
                .loginProcessingUrl("/login")
                //登录成功后跳转到的页面，只接受post请求
                 .successForwardUrl("/toMain")     // 底层使用的forward转发，不能访问项目之外的页面
//                .successHandler(new MyAuthenticationSuccessHandler("http://www.bilibili.com"))
                //登录失败后跳转到的页面，只接受post请求
                .failureForwardUrl("/toError");
//                .failureHandler(new MyAuthenticationFailureHandler("error.html"));


        http.authorizeRequests()
                //放行的页面地址 或者 接口请求地址
                .antMatchers("/images/**",   // 放行图片资源
                        "/login.html", "/error.html").permitAll()

//                .regexMatchers(HttpMethod.GET,"/test").permitAll()   // 放行post方式的请求
//                .mvcMatchers("/test").servletPath("/security").permitAll()
//                .antMatchers("/security/test").permitAll()
//                .antMatchers("/main1.html").hasAnyAuthority("fengyun")
//                .antMatchers("/main1.html").hasIpAddress("127.0.0.1")    // 基于IP进行放行
//                .antMatchers("/main1.html").hasAnyRole("test")

                //除了放行路径，其他页面地址访问 或者 接口访问地址，需要认证通过
                .anyRequest().authenticated();

        // 自定义403异常页面
        http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler);

        //关闭csrf防护
        http.csrf().disable();

    }
}
